/* Copyright (c) 2010, Carl Burch. License information is located in the
 * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */

package com.cburch.draw.shapes;

import com.cburch.draw.model.Handle;
import com.cburch.logisim.data.Location;

public class PolyUtil {
    private PolyUtil() {
    	
    }

    public static class ClosestResult {
        private double dist;
        private Location loc;
        private Handle prevHandle;
        private Handle nextHandle;

        public double getDistanceSq() {
            return dist;
        }

        public Location getLocation() {
            return loc;
        }

        public Handle getPreviousHandle() {
            return prevHandle;
        }

        public Handle getNextHandle() {
            return nextHandle;
        }
    }

    public static ClosestResult getClosestPoint(Location loc, boolean closed,
            Handle[] hs) {
        int xq = loc.getX();
        int yq = loc.getY();
        ClosestResult ret = new ClosestResult();
        ret.dist = Double.MAX_VALUE;
        if (hs.length > 0) {
            Handle h0 = hs[0];
            int x0 = h0.getX();
            int y0 = h0.getY();
            int stop = closed ? hs.length : (hs.length - 1);
            for(int i = 0; i < stop; i++) {
                Handle h1 = hs[(i + 1) % hs.length];
                int x1 = h1.getX();
                int y1 = h1.getY();
                double d = LineUtil.ptDistSqSegment(x0, y0, x1, y1, xq, yq);
                if (d < ret.dist) {
                    ret.dist = d;
                    ret.prevHandle = h0;
                    ret.nextHandle = h1;
                }
                h0 = h1;
                x0 = x1;
                y0 = y1;
            }
        }
        if (ret.dist == Double.MAX_VALUE) {
            return null;
        } else {
            Handle h0 = ret.prevHandle;
            Handle h1 = ret.nextHandle;
            double[] p = LineUtil.nearestPointSegment(xq, yq,
                    h0.getX(), h0.getY(), h1.getX(), h1.getY());
            ret.loc = Location.create((int) Math.round(p[0]),
                    (int) Math.round(p[1]));
            return ret;
        }
    }
}
